/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import GestorJugadores.Jugador;
import GestorPago.Pago;
import GestorPago.PagoBD;


import GestorCuota.Cuota;
import GestorCuota.CuotaBD;
import Interfaz.InterfazPagoCuota;

import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author frpp
 */
public class ControladorPago {
    
    /*
     IMPORTANTE EN LA LINEA 136 +-
     */
    
    private static ControladorPago Instancia=null;// = new JugadorBD();
    
    public List<Jugador> jugadores = new ArrayList<Jugador>();
    private List<Pago> pagos = new ArrayList<Pago>();
    
    
    private Jugador jugador;
    
    public int jugadorActivo;

    private int pagoActivo = -1;
    
    /**
     * Constructor por defecto. Al ser un singleton el contructor es privado
     * @param void
     * @return void
     */
    private ControladorPago(){
        jugadores=null;
        pagoActivo=-1;
        jugadorActivo=-1;
        jugador=null;
    }
    
    /**
     * Método que devuelve la única instancia de la clase
     * @param void
     * @return Instancia
     */
    public static ControladorPago getInstancia() {
        if (Instancia==null){
            Instancia = new ControladorPago();
        }
        return Instancia;
    }

    @Override
    /**
     * Sobrecarga del método clone para impedir que se duplique la instancia
     * (Exigencias del patrón Singleton)
     * @param void
     * @return Object
     */
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException(); 
    }
    
    /**
     * Método que inicializa el estado de la instancia
     * @param void
     * @return void
     */
    public void inicializar(){
        jugador=null;
        jugadores=null;
        pagoActivo=-1;
        jugadorActivo=-1;
    }
    

    
    
    
   /**
	 * 
	 * @return Boolean  True| cuota eliminada    False| cuota eliminada. 
	 */
    
    /*
	public boolean deleteCuota(){
            
            Boolean salida= false;
            if(PagoBD.getInstancia().deletePago(pagos[pagoActivo])) {
                InterfazJugador.getInstancia().mostrarMensaje("Cuota eliminada con éxito", "", 1);
                salida = true;
            }else{
               InterfazJugador.getInstancia().mostrarMensaje("Cuota no eliminada", "ERROR", 0);
            }
            
            return salida;
	}
    
    */
    
    
    
    
    
    
    
    
    
    
    
    
    
  
        
        //Hay que almacenar el nombre y los apellidos del jugador.
    
    
    
    
    
    
    public void AnotarPago(String temporada, String mes) {         
         
         if(VerificarDatosCorrectosPago(mes)){//Si el me es correcto
             Date aux = jugadores.get(jugadorActivo).getNacimiento();
             
            SimpleDateFormat formateador = new SimpleDateFormat("yyyy");    //le aplico el formato dia-mes-año        
            String fecha_consulta =  formateador.format(aux);
            
             int fecha = Integer.parseInt(fecha_consulta);
          
            ArrayList<Cuota> cuota = CuotaBD.getInstancia().getCuota(temporada, fecha);
            if(cuota == null){
                 InterfazPagoCuota.getInstancia().mostrarMensaje("Error en la cuota ", "Error", 0);
            }else{
            
                    Pago p = new Pago(cuota.get(0),jugadores.get(jugadorActivo),mes);
                    if(PagoBD.getInstancia().addPago(p) != null){
                        InterfazPagoCuota.getInstancia().mostrarMensaje("Éxito al añadir el pago ", "Éxito", 1);
                        pagos.add(p);
                        pagoActivo =0;
                    }else{
                        InterfazPagoCuota.getInstancia().mostrarMensaje("Error al añadir el pago ", "Error", 0);
                    }
              }
            
         }else{
                InterfazPagoCuota.getInstancia().mostrarMensaje("Error en los datos ", "Error", 0);
         }
       
    }
    
    
      public void updatePago(String temporada, String mes, String newmes){         

         if(VerificarDatosCorrectosPago(mes)){//Si el mes es correcto
            if(PagoBD.getInstancia().updatePago(jugadores.get(jugadorActivo), temporada, mes, newmes) == false){
                 InterfazPagoCuota.getInstancia().mostrarMensaje("Error al actualizar el pago", "Error", 0);
            }else{
               InterfazPagoCuota.getInstancia().mostrarMensaje("Ëxito en la búsqueda", "Éxito", 1);
            }
            
            //Si hace el update
         }else{
                InterfazPagoCuota.getInstancia().mostrarMensaje("Error en los datos ", "Error", 0);         
         }
       
         

    }
    
    
    
  
    
    
    /*  Método que obtiene una lista de nombre / apellidos de aquellos
         *  jugadores que han pagado el mes correspondiente.
         * 
         * @param String mes
         * @return []Integer lista jugadores
         * 
         */

     public void GenerarListadoPago(String temporada, String mes){
         
        ArrayList<Jugador> jug_ip = PagoBD.getInstancia().GenerarListadoPago(temporada, mes);
        
                
        if(!jug_ip.isEmpty()){// Si la consulta tiene datos...
            InterfazPagoCuota.getInstancia().mostrarTablaPagos(jug_ip);
        }else{
            InterfazPagoCuota.getInstancia().mostrarMensaje( "No hay  pagos ", "Error", 0);
        }
    }
    
     
     
     
     
        /*  Método que obtiene una lista de nombre / apellidos de aquellos
         *  jugadores que no han pagado el mes correspondiente.
         * 
         * @param String mes
         * @return []Integer lista jugadores
         * 
         */
    public void GenerarListadoImpago(String temporada, String mes){
        
        //ArrayList<Jugador> jug_imp = new ArrayList<Jugador>();
        ArrayList<Jugador> jug_imp = PagoBD.getInstancia().GenerarListadoImpago(temporada, mes);
                
        
        if(!jug_imp.isEmpty()){// Si la consulta tiene datos...
            InterfazPagoCuota.getInstancia().mostrarTablaImpagos(jug_imp);
        }else{
            InterfazPagoCuota.getInstancia().mostrarMensaje( "No hay  impagos ", "Error", 0);
        }
    }
    

    
    public void GenerarListadoPagoJugador(String temporada){
        
        
        
        int idJug = jugadores.get(jugadorActivo).getIdJugador();
        
        int ano = jugadores.get(jugadorActivo).getNacimiento().getYear();
        
        ArrayList<Pago> pag = PagoBD.getInstancia().GenerarListadoPagoJugador(idJug, ano, temporada);
        
        if(!pag.isEmpty()){// Si la consulta tiene datos...
        InterfazPagoCuota.getInstancia().mostrarTablaPagosJugador(pag);   
        }else{
          InterfazPagoCuota.getInstancia().mostrarMensaje( "No hay  pagos ", "Error", 0);
        }
    }
    
    
      
    /**
     * Método que recibe los datos de una Cuota como un vector de String
     * valida la corrección de los datos y, en caso de que sean correctos,
     * crea un objeto Cuota y lo devuelve. Si los datos no son válidos
     * muestra información en la interfaz acerca de cuales son incorrectos.
     * @param Datos Vector de String
     * @return Un objeto Jugador y los datos son correctos o null si no.
     */
    
        public Boolean VerificarDatosCorrectosPago(String datos){
        // Si algo incorrecto avisar a la interfaz y mostrar mensaje

            if ((datos == "Enero")||(datos == "Febrero")||(datos == "Marzo")||(datos == "Abril")||
                    (datos == "Mayo")||(datos == "Junio")||(datos == "Julio")||(datos == "Agosto")||
                    (datos == "Septiembre")||(datos == "Octubre")||(datos == "Noviembre")||(datos == "Diciembre")) {
            return true;
            }
            
          
            return false;              
        }
    
    
    
    
    
    
    
}
